NOTE
4.3 Redis Replication
1. 为什么需要Redis Replication - 分布式系统复制.md 2. 什么是Redis Replication - 把数据复制多个副本部署到其他机器 - 复制是Redis高可用(Redis Cluster/Redis Sentinel)的基础 2.1. Replication拓扑结构
这是历史学习笔记,可能存在过时或不完整的理解。
1. 为什么需要Redis Replication
2. 什么是Redis Replication
- 把数据复制多个副本部署到其他机器
- 复制是Redis高可用(Redis Cluster/Redis Sentinel)的基础
2.1. Replication拓扑结构
- 一主一从:用于主节点出现故障时进行故障转移
- 一主多从:利用多个从节点进行读写分离
- 树状主从:通过引入中间层降低了主节点复制的压力
3. 如何开启Redis Replication
-
master
- 配置
daemonize yes bind 127.0.0.1 port 6379 dir "/home/zsk/software/redis/redis0/data" logfile "/home/zsk/software/redis/redis0/log/6379.log"- 启动
redis0/bin/redis-server redis0/conf/redis.conf
-
slave
- 配置
daemonize yes bind 127.0.0.1 port 6380 dir "/home/zsk/software/redis/redis00/data" logfile "/home/zsk/software/redis/redis00/log/6380.log" slaveof 127.0.0.1 6379 slave-read-only yes- 启动
redis00/bin/redis-server redis00/conf/redis.conf
- 查看状态:
redis00/bin/redis-cli -p 6380 info replicationinfo
4. Redis Replication原理
4.1. 主从复制
4.1.1. Leader选举
4.1.1.1. 选举方法
启动的时候手动指定master
4.1.1.2. 脑裂问题
手动切换不存在脑裂问题
4.1.2. 数据同步
4.1.2.1. 同步过程
- 全量复制:master新开一个线程生成RDB文件,发送给slave,slave恢复数据
- slave发送psync -1
- master回复FULLRESYNC
- slave保存master信息
- master执行bgsave保存RDB到本地
- master发送RDB给slave
- master响应客户端读写命令,并写入缓存区
- slave清空数据
- slave加载RDB

4.1.2.2. 同步方式
异步
4.1.2.3. 同步日志
逻辑日志
4.1.3. 请求处理
4.1.3.1. 读请求
可由master或者slave处理,读写分离的情况下一般由slave处理,因此节点数越多,读请求吞吐越高
4.1.3.2. 写请求
必须由master处理,然后复制给slave
4.1.4. 故障处理
4.1.4.1. 故障检测
主从通过心跳保活
4.1.4.2. 故障恢复
4.1.4.2.1. slave宕机
- slave宕机重连触发增量复制
- 增量复制:master每写一条命令会放在缓冲区中,然后发送给slave,slave重现命令
- slave断开连接
- master持续写入缓冲区
- slave重新连接master
- slave发送psync
- master把缓存区的数据发送给slave

4.1.4.2.2. master宕机
- 手动提升某台slave为master,通知其他slave master变更
5. Redis Replication的问题
- 故障恢复复杂
- 一旦master挂掉,我们需要手动将一个从节点晋升为主节点,需要修改代码重新连接等
- 写能力受到单机的限制
- 一般我们都是master写,slave只负责读


